package utils;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;

import datensaetze.Analysator;
import datensaetze.Datensatz;
import datensaetze.DatensatzFactory;
import exceptions.NoPreferredNameException;
import exceptions.NoSuchItemException;
import analysatoren.Analysator130;

public abstract class DownloadBearbeiter {

	/**
	 * Kann durch den Konstruktor der implementierenden Klasse
	 * gesetzt werden.
	 */
	protected Map<String, Analysator> actions =
		new HashMap<String, Analysator>();

	protected File folder = null;

	protected String prefix = "";

	public void setActions(Map<String, Analysator> actions) {
		this.actions = actions;
	}

	public void setFolder(File folder) {
		this.folder = folder;
	}

	public void setFolder(String folder) {
		this.folder = new File(folder);
	}

	public void setPrefix(String prefix) {
		this.prefix = prefix;
	}

	public void bearbeiteAlleDateien()
			throws IOException,
			NoPreferredNameException,
			NoSuchItemException {
		File[] files = folder.listFiles();
		for (File file : files) {
			if (file.getName().startsWith(prefix)) {
				bearbeiteFile(file);
			}
		}
	}

	public void bearbeiteFile(String filename)
			throws IOException,
			NoPreferredNameException,
			NoSuchItemException {
		bearbeiteFile(new File(filename));
	}

	public void bearbeiteFile(File file)
			throws IOException,
			NoPreferredNameException,
			NoSuchItemException {

		BufferedReader br =
			new BufferedReader(new InputStreamReader(new FileInputStream(file)));

		Datensatz ds =
			DatensatzFactory.createDatensatzAusVollanzeige(actions, br);
		while (ds != null) {
			bearbeiteDS(ds);
			ds = DatensatzFactory.createDatensatzAusVollanzeige(actions, br);

		}

	}

	public void bearbeiteFile(File file, String encoding)
			throws IOException,
			NoPreferredNameException,
			NoSuchItemException {

		BufferedReader br =
			new BufferedReader(new InputStreamReader(new FileInputStream(file),
					encoding));

		Datensatz ds =
			DatensatzFactory.createDatensatzAusVollanzeige(actions, br);
		while (ds != null) {
			bearbeiteDS(ds);
			ds = DatensatzFactory.createDatensatzAusVollanzeige(actions, br);

		}

	}

	/**
	 * 
	 * @param ds	Der zu bearbeitende Datensatz.
	 */
	public abstract void bearbeiteDS(Datensatz ds);

	/*
	 * Beispielanwendung unter Einsatz von einem (oder auch mehreren)
	 * Downloadbearbeitern.
	 */
	public static void main(String[] args)
			throws IOException,
			NoPreferredNameException,
			NoSuchItemException {

		DownloadBearbeiter db = new DownloadBearbeiter() {

			@Override
			public void bearbeiteDS(Datensatz ds) {
				System.out.println(ds);
				System.out.println();
			}
		};

		HashMap<String, Analysator> myactions =
			new HashMap<String, Analysator>();
		Analysator130.anmeldenBei(myactions);

		db.setActions(myactions);
		db.setFolder("D:/normdaten");
		db.setPrefix("swd-p");
		db.bearbeiteAlleDateien();

	}

}
